<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title></title>
	<link rel="stylesheet" href="">
</head>
<body>
<script src='http://cdn.jsdelivr.net/vue/1.0.26/vue.js'></script>
<script src='https://cdn.jsdelivr.net/vue.router/0.7.10/vue-router.min.js'></script>
<div id="root">
　　<input type="text" v-focus="name" v-model="name" :data-name="name">
　　<button type="button" @click="name='zw'">click</button>
 
　　<!--当点击按钮的时候name改变，继而触发update中的方法-->	
</div>
<script>
	/**
	 * Vue.directive('dirName',function(){//定义指令});
	 * 指令跟组件一样需要注册才能使用，同样有两种方式，一种是全局注册:
	 * 另外一种是局部注册：
	 * new Vue({directives:{dirName:{//定义指令}}});
	 *
	 * 2.指令的定义
	 * 指令定义，官方提供了五个钩子函数来供我们使用，分别代表了一个组件的各个生命周期
	 * bind: 只调用一次，指令第一次绑定到元素时调用，用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
	 * inserted: 被绑定元素插入父节点时调用（父节点存在即可调用，不必存在于 document 中）。
	 * update: 被绑定元素所在的模板更新时调用，而不论绑定值是否变化。通过比较更新前后的绑定值，可以忽略不必要
	 * 模板更新（详细的钩子函数参数见下）。
	 * componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
	 * unbind: 只调用一次， 指令与元素解绑时调用。
	 * 在这里其他几个都好理解，关于模板更新（update）这里，本人的理解是：
	 * 该指令所在的模板有变化而需要重新渲染的时候，比如当一个输入框的model发生了变化就会触发指令。
	 * 当然此处说的比较模糊，具体的还有待研究。
	 */
	Vue.directive('focus',{
　　　　bind: function(el, binding){
　　　　console.log('bind:',binding.value);
　　},
　　inserted: function(el, binding){
　　　　console.log('insert:',binding.value);
　　},
　　update: function(el, binding, vnode, oldVnode){
　　　　el.focus();
　　　　console.log(el.dataset.name);//这里的数据是可以动态绑定的
　　　　console.table({
　　　　　　name:binding.name,
　　　　　　value:binding.value,
　　　　　　oldValue:binding.oldValue,
　　　　　　expression:binding.expression,
　　　　　　arg:binding.arg,
　　　　　　modifiers:binding.modifiers,
　　　　　　vnode:vnode,
　　　　　　oldVnode:oldVnode
　　　　});
　　},
　　componentUpdated: function(el, binding){
　　　　console.log('componentUpdated:',binding.name);
　　}
});
new Vue({
　　el:'#root',
　　data:{
　　　　name:'zwzhai'
　　}
});
/**
 * el: 指令所绑定的元素，可以用来直接操作 DOM 。
binding: 一个对象，包含以下属性：
name: 指令名，不包括 v- 前缀。
value: 指令的绑定值， 例如： v-my-directive="1 + 1", value 的值是 2。
oldValue: 指令绑定的前一个值，仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
expression: 绑定值的字符串形式。 例如 v-my-directive="1 + 1" ， expression 的值是 "1 + 1"。
arg: 传给指令的参数。例如 v-my-directive:foo， arg 的值是 "foo"。
modifiers: 一个包含修饰符的对象。 例如： v-my-directive.foo.bar, 修饰符对象 modifiers 的值是{ foo: true, bar: true }。
vnode: Vue 编译生成的虚拟节点，查阅 VNode API 了解更多详情。
oldVnode: 上一个虚拟节点，仅在 update 和 componentUpdated 钩子中可用。
这几个参数，大家看文档也能理解，就不多说了，关于bingding的几个属性说一下自己的看法，value这个属性，可以传字面量，也可以传单条语句（如上），还可以以变量的形式如<input type="text" v-focus="name" v-model="name">；arg这里可以传一个字符串，因为在value去访问绑定值得时候拿到的不是直接写的那个，也就是说v-focus="name",这个name永远都是一个变量，需要定义赋值，而arg可以直接访问该值，如v-focus:foo,那么在钩子函数中拿到的就是foo这个字符串。
在vue的指令中是不可以双向数据绑定的，如官方所说：除了 el 之外，其它参数都应该是只读的，尽量不要修改他们。如果需要在钩子之间共享数据，建议通过元素的 dataset 来进行。这里补充下关于dataset的知识：
data-  是html5的一个新属性，查了下浏览器支持程度，目前的主流浏览器都是支持的，IE的话要到10以上。具体的使用：在HTML中以属性的方式去写，data-yourname="value",在js中取这个属性就不用使用getAttribute这个方法，而是直接访问，ele.dataset.yourname,在js中你也可以添加和删除，添加：ele.dataset.dessert="yourname",删除：dette ele.dataset.name。此外，这个属性可以用作css选择器：.class[data-name]:{}。
 */
</script>	
</body>
</html>